#include <rtthread.h>
#include <rtdbg.h>
#include <rtdevice.h>
#include <board.h>
#include "main.h"
#include "rt_thread_demo.h"
#include "../hardware/KEY/key.h"

extern rt_event_t event_led;  // 事件集
extern rt_sem_t key_sem;      // 按钮按下释放 信号量

#if KEY_ISR == 0

/****************************** Key_Init BEGIN *********************************
 * 函    数：Key_Init
 * 功    能：初始化按键
 * 参    数：无
 * 返 回 值：无
 * 注    意：接线：一端接IO口，一端接3.3V！！！！
 ******************************************************************************/
void Key_Init(void)
{
    rt_pin_mode(KEY1, PIN_MODE_INPUT_PULLDOWN);  // 默认下拉输入 按下输出1，未按下0
    rt_pin_mode(KEY2, PIN_MODE_INPUT_PULLDOWN);  // 默认下拉输入 按下输出1，未按下0
    rt_pin_mode(KEY3, PIN_MODE_INPUT_PULLDOWN);  // 默认下拉输入 按下输出1，未按下0
}
/****************************** Key_Init END ***********************************/

/****************************** KEY_Scan BEGIN *********************************
 * 函    数：KEY_Scan
 * 功    能：扫描按键状态
 * 参    数：mode:0,不支持连续按;1,支持连续按
 * 返 回 值：返回当前按键值 KEY1 KEY2
 * 说    明：0，没有任何按键按下
 *           1，KEY1按下   //具体IO口看key.h文件
 *           2，KEY2按下
 *           3，KEY3按下
 *           注意此函数有响应优先级,KEY1>KEY2>KEY3
 ******************************************************************************/
uint8_t KEY_Scan(uint8_t mode)
{
    static uint8_t key_up = 1; // 按键按松开标志
    if (mode) key_up = 1;      // 支持连按
    if (key_up && (rt_pin_read(KEY1) == 1 || rt_pin_read(KEY2) == 1 || rt_pin_read(KEY3) == 1))
    {
        rt_thread_delay(5);    // 去抖动
        key_up = 0;
        if (rt_pin_read(KEY1) == 1) return KEY1_PRES;
        else if (rt_pin_read(KEY2) == 1) return KEY2_PRES;
        else if (rt_pin_read(KEY3) == 1) return KEY3_PRES;
    }
    else if (rt_pin_read(KEY1) == 0 && rt_pin_read(KEY2) == 0 && rt_pin_read(KEY3) == 0)
        key_up = 1;
    return 0; // 无按键按下
}
/****************************** KEY_Scan END ***********************************/

#else

/****************************** Key_Init BEGIN *********************************
 * 函    数：Key_Init
 * 功    能：初始化按键（中断方式）
 * 参    数：无
 * 返 回 值：无
 * 注    意：接线：一端接IO口，一端接3.3V！！！！
 ******************************************************************************/
void Key_Init(void)
{
    rt_pin_mode(KEY1, PIN_MODE_INPUT_PULLDOWN);
    rt_pin_attach_irq(KEY1, PIN_IRQ_MODE_RISING, key1_isr, RT_NULL); // 上升沿触发
    rt_pin_irq_enable(KEY1, PIN_IRQ_ENABLE);

    rt_pin_mode(KEY2, PIN_MODE_INPUT_PULLDOWN);
    rt_pin_attach_irq(KEY2, PIN_IRQ_MODE_RISING, key2_isr, RT_NULL); // 上升沿触发
    rt_pin_irq_enable(KEY2, PIN_IRQ_ENABLE);

    rt_pin_mode(KEY3, PIN_MODE_INPUT_PULLDOWN);
    rt_pin_attach_irq(KEY3, PIN_IRQ_MODE_RISING, key3_isr, RT_NULL); // 上升沿触发
    rt_pin_irq_enable(KEY3, PIN_IRQ_ENABLE);
}
/****************************** Key_Init END ***********************************/

/****************************** key1_isr BEGIN *********************************
 * 函    数：key1_isr
 * 功    能：KEY1中断服务函数
 * 参    数：args
 * 返 回 值：无
 ******************************************************************************/
void key1_isr(void *args)
{
#if KEY_LED_SEM == 1
    rt_sem_release(key_sem); // 发送信号量
#else
    rt_event_send(event_led, LOC(0)); // 发送第0位事件集
#endif
}
/****************************** key1_isr END ***********************************/

/****************************** key2_isr BEGIN *********************************
 * 函    数：key2_isr
 * 功    能：KEY2中断服务函数
 * 参    数：args
 * 返 回 值：无
 ******************************************************************************/
void key2_isr(void *args)
{
#if KEY_LED_SEM == 1
    rt_sem_release(key_sem); // 发送信号量
#else
    rt_event_send(event_led, LOC(1)); // 发送第1位事件集
#endif
}
/****************************** key2_isr END ***********************************/

/****************************** key3_isr BEGIN *********************************
 * 函    数：key3_isr
 * 功    能：KEY3中断服务函数
 * 参    数：args
 * 返 回 值：无
 ******************************************************************************/
void key3_isr(void *args)
{
#if KEY_LED_SEM == 1
    rt_sem_release(key_sem); // 发送信号量
#else
    rt_event_send(event_led, LOC(2)); // 发送第2位事件集
#endif
}
/****************************** key3_isr END ***********************************/

/****************************** KEY_Scan BEGIN *********************************
 * 函    数：KEY_Scan
 * 功    能：扫描按键状态（中断方式下为空实现）
 * 参    数：mode
 * 返 回 值：0
 ******************************************************************************/
uint8_t KEY_Scan(uint8_t mode)
{
    return 0; // 空实现
}
/****************************** KEY_Scan END ***********************************/

#endif
